home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / unarced / languages / c-manual / vsprites / example1.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  10KB  |  361 lines

  1. /* Example1                                                            */
  2. /* This example demonstrates how to get and use a VSprite. The VSprite */
  3. /* can be moved around by the user by pressing the arrow keys.         */
  4.  
  5.  
  6.  
  7. /* Since we use Intuition, include this file: */
  8. #include <intuition/intuition.h>
  9.  
  10. /* Include this file since you are using sprites: */
  11. #include <graphics/gels.h>
  12.  
  13.  
  14.  
  15. /* Declare the functions we are going to use: */
  16. void main();
  17. void clean_up();
  18.  
  19.  
  20.  
  21. struct IntuitionBase *IntuitionBase = NULL;
  22. /* We need to open the Graphics library since we are using sprites: */
  23. struct GfxBase *GfxBase = NULL;
  24.  
  25.  
  26.  
  27. /* Declare a pointer to a Screen structure: */ 
  28. struct Screen *my_screen;
  29.  
  30. /* Declare and initialize your NewScreen structure: */
  31. struct NewScreen my_new_screen=
  32. {
  33.   0,            /* LeftEdge  Should always be 0. */
  34.   0,            /* TopEdge   Top of the display.*/
  35.   640,          /* Width     We are using a high-resolution screen. */
  36.   200,          /* Height    Non-Interlaced NTSC (American) display. */
  37.   2,            /* Depth     4 colours. */
  38.   0,            /* DetailPen Text should be drawn with colour reg. 0 */
  39.   1,            /* BlockPen  Blocks should be drawn with colour reg. 1 */
  40.   HIRES|SPRITES,/* ViewModes High resolution, sprites will be used. */
  41.   CUSTOMSCREEN, /* Type      Your own customized screen. */
  42.   NULL,         /* Font      Default font. */
  43.   "VSprites!",  /* Title     The screen's title. */
  44.   NULL,         /* Gadget    Must for the moment be NULL. */
  45.   NULL          /* BitMap    No special CustomBitMap. */
  46. };
  47.  
  48.  
  49.  
  50. /* Declare a pointer to a Window structure: */ 
  51. struct Window *my_window = NULL;
  52.  
  53. /* Declare and initialize your NewWindow structure: */
  54. struct NewWindow my_new_window=
  55. {
  56.   0,             /* LeftEdge    x position of the window. */
  57.   0,             /* TopEdge     y positio of the window. */
  58.   640,           /* Width       640 pixels wide. */
  59.   200,           /* Height      200 lines high. */
  60.   0,             /* DetailPen   Text should be drawn with colour reg. 0 */
  61.   1,             /* BlockPen    Blocks should be drawn with colour reg. 1 */
  62.   CLOSEWINDOW|   /* IDCMPFlags  The window will give us a message if the */
  63.   RAWKEY,        /*             user has selected the Close window gad, */
  64.                  /*             or if the user has pressed a key. */
  65.   SMART_REFRESH| /* Flags       Intuition should refresh the window. */
  66.   WINDOWCLOSE|   /*             Close Gadget. */
  67.   WINDOWDRAG|    /*             Drag gadget. */
  68.   WINDOWDEPTH|   /*             Depth arrange Gadgets. */
  69.   WINDOWSIZING|  /*             Sizing Gadget. */
  70.   ACTIVATE,      /*             The window should be Active when opened. */
  71.   NULL,          /* FirstGadget No Custom gadgets. */
  72.   NULL,          /* CheckMark   Use Intuition's default CheckMark. */
  73.   "Use the arrow keys to move the VSprite!", /* Title */
  74.   NULL,          /* Screen      Will later be connected to a custom scr. */
  75.   NULL,          /* BitMap      No Custom BitMap. */
  76.   80,            /* MinWidth    We will not allow the window to become */
  77.   30,            /* MinHeight   smaller than 80 x 30, and not bigger */
  78.   640,           /* MaxWidth    than 640 x 200. */
  79.   200,           /* MaxHeight */
  80.   CUSTOMSCREEN   /* Type        Connected to the Workbench Screen. */
  81. };
  82.  
  83.  
  84.  
  85. /* 1. Declare and initialize some sprite */
  86. /*    data for each VSprite:             */
  87. UWORD chip vsprite_data[]=
  88. {
  89.   0x0180, 0x0000,
  90.   0x03C0, 0x0000,
  91.   0x07E0, 0x0000,
  92.   0x0FF0, 0x0000,
  93.   0x1FF8, 0x0000,
  94.   0x3FFC, 0x0000,
  95.   0x7FFE, 0x0000,
  96.   0x0000, 0xFFFF,
  97.   0x0000, 0xFFFF,
  98.   0x7FFE, 0x7FFE,
  99.   0x3FFC, 0x3FFC,
  100.   0x1FF8, 0x1FF8,
  101.   0x0FF0, 0x0FF0,
  102.   0x07E0, 0x07E0,
  103.   0x03C0, 0x03C0,
  104.   0x0180, 0x0180,
  105. };
  106.  
  107.  
  108.  
  109. /* 2. Declare three VSprite structures. One will be used, */
  110. /*    the other two are "dummies":                        */
  111. struct VSprite head, tail, vsprite;
  112.  
  113.  
  114. /* 3. Decide the VSprite's colours:            */
  115. /*                         RGB     RGB     RGB */
  116. WORD colour_table[] = { 0x000F, 0x00F0, 0x0F00 };
  117.  
  118.  
  119. /* 4. Declare a GelsInfo structure: */
  120. struct GelsInfo ginfo;
  121.  
  122.  
  123. /* This boolean variable will tell us if the VSprite is in */
  124. /* the list or not:                                        */
  125. BOOL vsprite_on = FALSE;
  126.  
  127.  
  128. /* This program will not open any console window if run from */
  129. /* Workbench, but we must therefore not print anything.      */
  130. /* Functions like printf() must therefore not be used.       */
  131. void _main()
  132. {
  133.   /* The GelsInfo structure needs the following arrays: */
  134.   WORD nextline[ 8 ];
  135.   WORD *lastcolor[ 8 ];
  136.  
  137.   /* Sprite position: */
  138.   WORD x = 40;
  139.   WORD y = 40;
  140.  
  141.   /* Direction of the sprite: */
  142.   WORD x_direction = 0;
  143.   WORD y_direction = 0;
  144.  
  145.   /* Boolean variable used for the while loop: */
  146.   BOOL close_me = FALSE;
  147.  
  148.   ULONG class; /* IDCMP */
  149.   USHORT code; /* Code */
  150.  
  151.   /* Declare a pointer to an IntuiMessage structure: */
  152.   struct IntuiMessage *my_message;
  153.  
  154.  
  155.  
  156.   /* Open the Intuition Library: */
  157.   IntuitionBase = (struct IntuitionBase *)
  158.     OpenLibrary( "intuition.library", 0 );
  159.   
  160.   if( IntuitionBase == NULL )
  161.     clean_up(); /* Could NOT open the Intuition Library! */
  162.  
  163.  
  164.  
  165.   /* 5. Open the Graphics Library:                                    */
  166.   /* Since we are using sprites we need to open the Graphics Library: */
  167.   /* Open the Graphics Library: */
  168.   GfxBase = (struct GfxBase *)
  169.     OpenLibrary( "graphics.library", 0);
  170.  
  171.   if( GfxBase == NULL )
  172.     clean_up(); /* Could NOT open the Graphics Library! */
  173.  
  174.  
  175.  
  176.   /* We will now try to open the screen: */
  177.   my_screen = (struct Screen *) OpenScreen( &my_new_screen );
  178.  
  179.   /* Have we opened the screen succesfully? */
  180.   if(my_screen == NULL)
  181.     clean_up();
  182.  
  183.  
  184.   my_new_window.Screen = my_screen;
  185.  
  186.  
  187.   /* We will now try to open the window: */
  188.   my_window = (struct Window *) OpenWindow( &my_new_window );
  189.   
  190.   /* Have we opened the window succesfully? */
  191.   if(my_window == NULL)
  192.     clean_up(); /* Could NOT open the Window! */
  193.  
  194.  
  195.  
  196.   /* 6. Initialize the GelsInfo structure: */
  197.  
  198.   /* All sprites except the first two may be used to draw */
  199.   /* the VSprites: ( 11111100 = 0xFC )                    */
  200.   ginfo.sprRsrvd = 0xFC;
  201.   /* If we do not exclude the first two sprites, the mouse */
  202.   /* pointer's colours may be affected.                    */
  203.  
  204.  
  205.   /* Give the GelsInfo structure some memory: */
  206.   ginfo.nextLine = nextline;
  207.   ginfo.lastColor = lastcolor;
  208.  
  209.  
  210.   /* Give the Rastport a pointer to the GelsInfo structure: */
  211.   my_window->RPort->GelsInfo = &ginfo;
  212.  
  213.   
  214.   /* Give the GelsInfo structure to the system: */
  215.   InitGels( &head, &tail, &ginfo );
  216.  
  217.  
  218.  
  219.   /* 7. Initialize the VSprite structure: */
  220.  
  221.   vsprite.Flags = VSPRITE; /* It is a VSprite.            */
  222.   vsprite.X = x;           /* X position.                 */
  223.   vsprite.Y = y;           /* Y position.                 */
  224.   vsprite.Height = 16;     /* 16 lines tall.              */
  225.   vsprite.Width = 2;       /* Two bytes (16 pixels) wide. */
  226.   vsprite.Depth = 2;       /* Two bitplanes, 4 colours.   */
  227.  
  228.  
  229.   /* Pointer to the sprite data: */
  230.   vsprite.ImageData = vsprite_data;
  231.  
  232.   /* Pointer to the colour table: */
  233.   vsprite.SprColors = colour_table;
  234.  
  235.  
  236.  
  237.   /* 8. Add the VSprites to the VSprite list: */
  238.   AddVSprite( &vsprite, my_window->RPort );
  239.  
  240.   /* The VSprite is in the list. */
  241.   vsprite_on = TRUE;
  242.   
  243.  
  244.  
  245.   /* Stay in the while loop until the user has selected the Close window */
  246.   /* gadget: */
  247.   while( close_me == FALSE )
  248.   {
  249.     /* Stay in the while loop as long as we can collect messages */
  250.     /* sucessfully: */
  251.     while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
  252.     {
  253.       /* After we have collected the message we can read it, and save any */
  254.       /* important values which we maybe want to check later: */
  255.       class = my_message->Class;
  256.       code  = my_message->Code;
  257.  
  258.  
  259.       /* After we have read it we reply as fast as possible: */
  260.       /* REMEMBER! Do never try to read a message after you have replied! */
  261.       /* Some other process has maybe changed it. */
  262.       ReplyMsg( my_message );
  263.  
  264.  
  265.       /* Check which IDCMP flag was sent: */
  266.       switch( class )
  267.       {
  268.         case CLOSEWINDOW:     /* Quit! */
  269.                close_me=TRUE;
  270.                break;  
  271.  
  272.         case RAWKEY:          /* A key was pressed! */
  273.                /* Check which key was pressed: */
  274.                switch( code )
  275.                {
  276.                  /* Up Arrow: */
  277.                  case 0x4C:      y_direction = -1; break; /* Pressed */
  278.                  case 0x4C+0x80: y_direction = 0;  break; /* Released */
  279.  
  280.                  /* Down Arrow: */
  281.                  case 0x4D:      y_direction = 1; break; /* Pressed */
  282.                  case 0x4D+0x80: y_direction = 0; break; /* Released */
  283.  
  284.                  /* Right Arrow: */
  285.                  case 0x4E:      x_direction = 2; break; /* Pressed */
  286.                  case 0x4E+0x80: x_direction = 0; break; /* Released */
  287.  
  288.                  /* Left Arrow: */
  289.                  case 0x4F:      x_direction = -2; break; /* Pressed */
  290.                  case 0x4F+0x80: x_direction = 0;  break; /* Released */
  291.                }
  292.                break;  
  293.       }
  294.     }
  295.  
  296.  
  297.  
  298.     /* 12. Play around with the VSprite: */
  299.  
  300.     /* Change the x/y position: */
  301.     x += x_direction;
  302.     y += y_direction;
  303.  
  304.     /* Check that the sprite does not move outside the screen: */
  305.     if(x > 640)
  306.       x = 640;
  307.     if(x < 0)
  308.       x = 0;
  309.     if(y > 200)
  310.       y = 200;
  311.     if(y < 0)
  312.       y = 0;
  313.  
  314.     vsprite.X = x;
  315.     vsprite.Y = y;
  316.  
  317.  
  318.  
  319.     /* 9. Sort the Gels list: */
  320.     SortGList( my_window->RPort );
  321.  
  322.     /* 10. Draw the Gels list: */
  323.     DrawGList( my_window->RPort, &(my_screen->ViewPort) );
  324.  
  325.     /* 11. Set the Copper and redraw the display: */
  326.     MakeScreen( my_screen );
  327.     RethinkDisplay();    
  328.   }
  329.  
  330.  
  331.  
  332.   /* Free all allocated memory: (Close the window, libraries etc) */
  333.   clean_up();
  334.  
  335.   /* THE END */
  336. }
  337.  
  338.  
  339.  
  340. /* This function frees all allocated memory. */
  341. void clean_up()
  342. {
  343.   /* 13. Remove the VSprites: */
  344.   if( vsprite_on )
  345.     RemVSprite( &vsprite );
  346.  
  347.   if( my_window )
  348.     CloseWindow( my_window );
  349.   
  350.   if(my_screen )
  351.     CloseScreen( my_screen );
  352.  
  353.   if( GfxBase )
  354.     CloseLibrary( GfxBase );
  355.  
  356.   if( IntuitionBase )
  357.     CloseLibrary( IntuitionBase );
  358.  
  359.   exit();
  360. }
  361.